package com.fdb.efp.nls.service.impl.bd;

import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.basic.framework.core.util.StringUtil;
import com.fdb.efp.nls.service.facade.bd.BdRepayAccLoanBatchService;
import com.fdb.efp.nls.service.util.DueDataUtil;
import com.fdb.efp.limit.service.facade.LmtPrdContService;
import com.fdb.efp.nls.service.facade.AccLoanService;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.facade.BdRepayAccLoanTempService;
import com.fdb.efp.nls.service.facade.LoanRepayDetailService;
import com.fdb.efp.nls.service.vo.AccLoanVO;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.service.vo.BdRepayAccLoanTempVO;
import com.fdb.efp.loan.service.vo.LoanRepayDetailVO;
import com.fdb.efp.nls.service.facade.BdLoanpayService;
import com.fdb.efp.nls.service.facade.NlsApplyInfoService;
import com.fdb.efp.nls.service.facade.ed.LmtRecoverRecordService;
import com.fdb.efp.nls.service.vo.BdLoanpayVO;
import com.fdb.efp.nls.service.vo.NlsApplyInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * 根据百度同步过来的还款信息借据临时表数据修改还款信息借据表
 * 
 * @author ludayong
 * @since 2019年3月7日 下午7:12:45
 * @version 1.0
 */
@Service("bdRepayAccLoanBatchService")
public class BdRepayAccLoanBatchServiceImpl implements BdRepayAccLoanBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdRepayAccLoanBatchServiceImpl.class);

	// 还款信息借据临时表
	@Autowired
	@Qualifier("bdRepayAccLoanTempService")
	private BdRepayAccLoanTempService bdRepayAccLoanTempService;

	// 还款信息借据表
	@Autowired
	@Qualifier("loanRepayDetailService")
	private LoanRepayDetailService loanRepayDetailService;

	// 错误信息
	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;

	// 借据信息
	@Autowired
	@Qualifier("accLoanService")
	private AccLoanService accLoanService;

	// 百度放款通知记录信息
	@Autowired
	@Qualifier("bdLoanpayService")
	private BdLoanpayService bdLoanpayService;

	// 网贷申请信息
	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;

	// 额度信息
	@Autowired
	@Qualifier("lmtPrdContService")
	private LmtPrdContService lmtPrdContService;

	// 额度恢复记录信息
	@Autowired
	@Qualifier("lmtRecoverRecordService")
	private LmtRecoverRecordService lmtRecoverRecordService;

	/**
	 * 
	 * 根据百度同步过来的百度还款信息借据临时表数据修改还款信息借据表 <br>
	 * 0.1:ludayong:2019年3月7日 下午7:27:22:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月7日 下午7:27:22
	 * @date 2019年3月7日 下午7:27:22
	 * @version 0.1
	 */
	public boolean batchUpdateRepayAccLoan() throws Exception {
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步百度还款信息借据临时数据到还款信息借据表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		// 可以配置参数
		Integer pageSize = 1000;
		try {
			// 分页信息
			BdRepayAccLoanTempVO pageInfo = new BdRepayAccLoanTempVO();
			// 新增或者修改的还款信息借据数量
			int num = 0;
			// 页数
			int page = 1;
			// pageSize初始化
			if (pageSize > 0) {
				pageInfo.setSize(pageSize);
			} else {
				pageInfo.setSize(1000);
			}
			// 新增或者修改
			//int insertOrUpdateNum = 0;
			// 判断循环次数
			int size = bdRepayAccLoanTempService.queryCount();
			String size_msg = "【还款信息借据临时表】数据量：" + size;
			logger.info(size_msg, "message{}");
			int loopCount = (size / pageInfo.getSize()) + 1;

			// 放款信息
			// BdDnDetailTempVO inBdDnDetailTempVO = new BdDnDetailTempVO();
			// 百度放款通知记录信息
			BdLoanpayVO inBdLoanpayVO = new BdLoanpayVO();
			// 网贷申请基本信息
			NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
			// 借据信息
			AccLoanVO inAccLoanVO = new AccLoanVO();
			// 额度信息入参
//			LmtPrdContVO inLmtPrdContVo = new LmtPrdContVO();
			// 额度信息查询信息
//			LmtPrdContVO queryLmtPrdContVo = null;
			// 查询的网贷申请基本信息
			NlsApplyInfoVO queryNlsApplyInfoVO = null;
			// 借据号
			String bdLoanId = null;
			for (int i = 0; i < loopCount; i++) {
				String page_msg = "【还款信息借据临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
				logger.info(page_msg, "message{}");
				// 分页查询【还款信息借据表】数据
				List<BdRepayAccLoanTempVO> tempList = bdRepayAccLoanTempService.queryByPage(pageInfo);
				if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
					// 需要新增或者修改的还款明细信息
					List<LoanRepayDetailVO> list = new ArrayList<LoanRepayDetailVO>();
					for (BdRepayAccLoanTempVO bdRepayAccLoanTempVO : tempList) {
						// 新增或者修改数量
						//insertOrUpdateNum = 0;
						bdLoanId = bdRepayAccLoanTempVO.getLoanId();
						// 放款明细入参
						// inBdDnDetailTempVO.setLoanId(bdLoanId);
						// 查询的放款信息
						// BdDnDetailTempVO queryBdDnDetailTempVO =
						// bdDnDetailTempService.queryByPk(inBdDnDetailTempVO);
						// 百度放款通知记录信息
						inBdLoanpayVO.setLoanId(bdLoanId);
						// 查询百度放款通知记录信息
						BdLoanpayVO queryBdLoanpayVO = bdLoanpayService.queryByPk(inBdLoanpayVO);
						String orderId = "";
						if (Objects.nonNull(queryBdLoanpayVO)) {
							// 订单号
							orderId = queryBdLoanpayVO.getOrderId();
						} 
//						else {
//							String tableName = "bd_loanpay";
//							String errorMsg = "未查询到还款明细分期信息关联的百度放款通知记录信息，借据号：" + bdLoanId;
//							addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
//							logger.error(errorMsg);
//						}
						// 网贷用信申请流水号
						String applySeq = "";
						// 授信申请流水号
//						String lmtApplySeq = "";
						// 订单号非空
						if (!StringUtil.isNullorBank(orderId)) {
							// 订单号
							inNlsApplyInfoVO.setBdOrderId(orderId);
							// 查询的网贷申请基本信息
							queryNlsApplyInfoVO = nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);
							if (Objects.nonNull(queryNlsApplyInfoVO)) {
								// 网贷用信申请流水号
								applySeq = queryNlsApplyInfoVO.getApplySeq();
								// 授信申请流水号
//								lmtApplySeq = queryNlsApplyInfoVO.getLmtApplySeq();
							} 
//							else {
//								String tableName = "nls_apply_info";
//								String errorMsg = "未查询到还款明细分期信息关联的网贷申请基本信息，放款订单号：" + orderId + "，借据号：" + bdLoanId;
//								addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
//								logger.error(errorMsg);
//							}
						}
						// 授信申请流水号非空
//						if (!StringUtil.isNullorBank(lmtApplySeq)) {
//							// 授信申请流水号
//							inLmtPrdContVo.setLmtApplySeq(lmtApplySeq);
//							// 额度信息
//							queryLmtPrdContVo = lmtPrdContService.queryByPk(inLmtPrdContVo);
//						}
						// 网贷用信申请流水号非空
//						if (!StringUtil.isNullorBank(applySeq)) {
							// 设置借据号
							inAccLoanVO.setBillNo(bdRepayAccLoanTempVO.getLoanId());
							AccLoanVO queryAccLoanVo = accLoanService.queryByPk(inAccLoanVO);
							// 1.1根据还款信息借据临时信息的借据号查询借据信息是否存在，存在：进行下一步操作，不存在：记录异常信息
							if (Objects.nonNull(queryAccLoanVo)) {
								// 2.1根据还款信息借据临时信息的借据号查询还款信息借据正式表LoanRepayDetail信息是否存在，存在进行修改，不存在新增
//								boolean isExit = queryLoanRepayDetailInfo(bdRepayAccLoanTempVO);
								// 需要新增或更新还款信息借据正式表LoanRepayDetail
								LoanRepayDetailVO loanRepayDetailInfo = initLoanRepayDetail(bdRepayAccLoanTempVO, queryAccLoanVo, applySeq);
								list.add(loanRepayDetailInfo);
//								if (!isExit) {
//									insertOrUpdateNum = loanRepayDetailService.insertLoanRepayDetail(loanRepayDetailInfo);
//								} else {
//									insertOrUpdateNum = loanRepayDetailService.updateByPk(loanRepayDetailInfo);
//								}
								// 校验实时额度恢复记录是否有生成
//								chenkLmtRecoverRecordInfo(queryNlsApplyInfoVO, bdRepayAccLoanTempVO, queryLmtPrdContVo);
							} else {
								String tableName = "acc_loan";
								String errorMsg = "未查询到还款信息借据临时信息关联的借据信息";
								addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
								logger.error(errorMsg);
							}
//						}
					}
					if (list != null && !list.isEmpty()) {
						num += loanRepayDetailService.insertOrUpdateLoanRepayDetail(list);
					}
				}
				pageInfo.setPage(++page);
			}
			String num_msg = "【还款明细表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "loan_repay_detail";
			String errorMsg = "同步百度还款信息借据临时数据到还款信息借据表出错";
			String remark = "同步百度还款信息借据临时数据到还款信息借据表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步百度还款信息借据临时数据到还款信息借据表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步百度还款信息借据临时数据到还款信息借据表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据还款信息借据临时信息的借据号初始化还款信息借据正式表LoanRepayDetail信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public LoanRepayDetailVO initLoanRepayDetail(BdRepayAccLoanTempVO bdRepayAccLoanTemp, AccLoanVO accLoanVo, String contNo) {
		LoanRepayDetailVO loanRepayDetailVo = new LoanRepayDetailVO();
		LoanRepayDetailVO queryLoanRepayDetailVO = null;
		if (Objects.nonNull(bdRepayAccLoanTemp)) {
			// 交易流水号
			loanRepayDetailVo.setSetlSeq(bdRepayAccLoanTemp.getSeqNo());
			// 查询还款信息借据正式表LoanRepayDetail信息是否存在
			queryLoanRepayDetailVO = loanRepayDetailService.queryByPk(loanRepayDetailVo);
		}
		LoanRepayDetailVO newLoanRepayDetailVo = null;
		if (Objects.isNull(queryLoanRepayDetailVO)) {
			// 还款信息借据正式表LoanRepayDetail信息
			newLoanRepayDetailVo = new LoanRepayDetailVO();
			// setl_create_usr 创建用户
			final String lastChgUsr = "admin";
			newLoanRepayDetailVo.setSetlCreateUsr(lastChgUsr);
			// setl_create_dt 创建日期
			newLoanRepayDetailVo.setSetlCreateDt(DateTool.getCurrentDateTime());
			// 根据还款信息借据临时信息的借据号初始化还款信息借据正式表LoanRepayDetail信息
			newLoanRepayDetailVo = initLoanRepayDetailInfo(bdRepayAccLoanTemp, newLoanRepayDetailVo, accLoanVo, contNo);
			return newLoanRepayDetailVo;
		} else {
			// 根据还款信息借据临时信息的借据号初始化还款信息借据正式表LoanRepayDetail信息
			queryLoanRepayDetailVO = initLoanRepayDetailInfo(bdRepayAccLoanTemp, queryLoanRepayDetailVO, accLoanVo, contNo);
			return queryLoanRepayDetailVO;
		}
	}

	/**
	 * 
	 * 根据还款信息借据临时信息的借据号初始化还款信息借据正式表LoanRepayDetail信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public LoanRepayDetailVO initLoanRepayDetailInfo(BdRepayAccLoanTempVO bdRepayAccLoanTemp, LoanRepayDetailVO loanRepayDetailVO,
			AccLoanVO accLoanVo, String contNo) {
		// cust_name 客户名称 cus_name 客户名称
		loanRepayDetailVO.setCustName(accLoanVo.getCusName());
		// id_type 证件类型 cert_type 证件类型
		loanRepayDetailVO.setIdType(accLoanVo.getCertType());
		// id_no 证件号码 cert_code 证件号码
		loanRepayDetailVO.setIdNo(accLoanVo.getCertCode());
		// dn_amt 放款金额 loan_amount 借据金额
		loanRepayDetailVO.setDnAmt(DueDataUtil.checkDecimalInfo(accLoanVo.getLoanAmount(), 0));
		// ps_rem_prcp 剩余正常本金 loan_balance 借据余额
		//loanRepayDetailVO.setPsRemPrcp(DueDataUtil.checkDecimalInfo(accLoanVo.getLoanBalance(), 0));
		// int_rat 执行年利率 reality_ir_y 固定利率
		loanRepayDetailVO.setIntRat(accLoanVo.getRealityIrY());
		// seq_no 交易流水号 setl_seq 还款流水号
		loanRepayDetailVO.setSetlSeq(bdRepayAccLoanTemp.getSeqNo());
		// loan_id 借据号 bill_no 借据号
		loanRepayDetailVO.setLoanNo(accLoanVo.getBillNo());
		// cont_no 贷款合同编号
		loanRepayDetailVO.setContNo(contNo);
		// pnlt_int_amt 罚息发生额 all_od_int_amt 还款时总拖欠罚息
		loanRepayDetailVO.setAllOdIntAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getPnltIntAmt(), 100));
		// int_amt 利息发生额 all_od_norm_int_amt 还款时总拖欠利息
		loanRepayDetailVO.setAllOdNormIntAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getIntAmt(), 100));
		// prin_amt 本金发生额 all_od_prcp_amt 还款时总拖欠本金
		loanRepayDetailVO.setAllOdPrcpAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getPrinAmt(), 100));
		// total_amt 交易金额 total_amt 本次还款总计金额
		loanRepayDetailVO.setTotalAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getTotalAmt(), 100));
		// pnlt_int_amt 罚息发生额 setl_od_int_amt 归还罚息金额
		loanRepayDetailVO.setSetlOdIntAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getPnltIntAmt(), 100));
		// int_amt 利息发生额 setl_od_norm_int 归还欠息金额
		loanRepayDetailVO.setSetlOdNormInt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getIntAmt(), 100));
		// prin_amt 本金发生额 setl_od_prcp_amt 归还欠本金额
		loanRepayDetailVO.setSetlOdPrcpAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getPrinAmt(), 100));
		// setl_origin 主动还款渠道 05百度04马上
		loanRepayDetailVO.setSetlOrigin("05");
		// cur_date 账务日期 setl_val_dt 生效日期
		loanRepayDetailVO.setSetlValDt(DueDataUtil.dateInfoTrans(bdRepayAccLoanTemp.getCurDate()));
		// tran_date 交易日期 setl_apply_dt 主动还款申请日期
		loanRepayDetailVO.setSetlApplyDt(DueDataUtil.dateInfoTrans(bdRepayAccLoanTemp.getTranDate()));

		// int_reduced_amt_coupon 优惠券抵扣利息金额 单位：分
		loanRepayDetailVO.setIntReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getIntReducedAmtCoupon(), 100));
		// pnlt_reduced_amt_coupon 优惠券抵扣罚息金额 单位：分
		loanRepayDetailVO.setPnltReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getPnltReducedAmtCoupon(), 100));
		// fund_fee_reduced_amt_coupon 优惠券抵扣借款服务费金额 单位：分
		loanRepayDetailVO.setFundFeeReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getFundFeeReducedAmtCoupon(), 100));
		// income_amt 实收金额 单位：分
		loanRepayDetailVO.setIncomeAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getIncomeAmt(), 100));
		// fund_fee_amt 借款服务费发生额 单位：分
		loanRepayDetailVO.setFundFeeAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getFundFeeAmt(), 100));
		// charges_reduced_amt_coupon 优惠券抵扣分期手续费 单位：分
		loanRepayDetailVO.setChargesReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getChargesReducedAmtCoupon(), 100));
		// overdue_reduced_amt_coupon 优惠券抵扣逾期费 单位：分
		loanRepayDetailVO.setOverdueReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getOverdueReducedAmtCoupon(), 100));
		// repay_violate_reduced_amt_coupon 优惠券抵扣提前还款违约金 单位：分
		loanRepayDetailVO.setRepayViolateReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getRepayViolateReducedAmtCoupon(), 100));
		// refund_violate_reduced_amt_coupon 优惠券抵扣退款违约金 单位：分
		loanRepayDetailVO.setRefundViolateReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getRefundViolateReducedAmtCoupon(), 100));
		// service_reduced_amt_coupon 优惠券抵扣担保费 单位：分
		loanRepayDetailVO.setServiceReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getServiceReducedAmtCoupon(), 100));
		// charges_amt 分期手续费发生额 单位：分
		loanRepayDetailVO.setChargesAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getChargesAmt(), 100));
		// overdue_amt 逾期费发生额 单位：分
		loanRepayDetailVO.setOverdueAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getOverdueAmt(), 100));
		// repay_violate_amt 提前还款违约金发生额 单位：分
		loanRepayDetailVO.setRepayViolateAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getRepayViolateAmt(), 100));
		// refund_violate_amt 退款违约金发生额 单位：分
		loanRepayDetailVO.setRefundViolateAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getRefundViolateAmt(), 100));
		// service_amt 担保费发生额 单位：分
		loanRepayDetailVO.setServiceAmt(DueDataUtil.checkDecimalInfo(bdRepayAccLoanTemp.getServiceAmt(), 100));

		// last_chg_usr 最新变更用户
		final String lastChgUsr = "admin";
		loanRepayDetailVO.setLastChgUsr(lastChgUsr);
		// last_chg_dt 最新变更时间
		loanRepayDetailVO.setLastChgDt(DateTool.getCurrentDateTime());
		// 2020/03/10 modify by ludayong
		// repay_term 还款期数
		loanRepayDetailVO.setRepayTerm("0");
		return loanRepayDetailVO;
	}

	/**
	 * 
	 * 根据还款信息借据临时信息的借据号查询还款信息借据正式表LoanRepayDetail信息是否存在 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public boolean queryLoanRepayDetailInfo(BdRepayAccLoanTempVO bdRepayAccLoanTemp) {
		boolean isExit = false;
		LoanRepayDetailVO loanRepayDetailVo = new LoanRepayDetailVO();
		if (Objects.nonNull(bdRepayAccLoanTemp)) {
			// 交易流水号
			loanRepayDetailVo.setSetlSeq(bdRepayAccLoanTemp.getSeqNo());
			// 查询还款信息借据正式表LoanRepayDetail信息是否存在
			LoanRepayDetailVO queryLoanRepayDetailVO = loanRepayDetailService.queryByPk(loanRepayDetailVo);
			if (Objects.nonNull(queryLoanRepayDetailVO)) {
				isExit = true;
			}
		}
		return isExit;
	}

	/**
	 * 
	 * 校验实时额度恢复记录是否有生成 <br>
	 * 0.1:ludayong:2019年5月24日 上午9:03:13:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月24日 上午9:03:13
	 * @date 2019年5月24日 上午9:03:13
	 * @version 0.1
	 */
//	public void chenkLmtRecoverRecordInfo(NlsApplyInfoVO queryNlsApplyInfoVO, BdRepayAccLoanTempVO bdRepayAccLoanTempVO,
//			LmtPrdContVO queryLmtPrdContVo) throws Exception {
//		// 单位转换
//		final int oneHundred100 = 100;
//		// 校验实时额度恢复记录是否有生成
//		LmtRecoverRecordVO inLmtRecoverRecordVo = new LmtRecoverRecordVO();
//		inLmtRecoverRecordVo.setLmtApplySeq(queryNlsApplyInfoVO.getApplySeq());
//		// 用信申请流水号
//		inLmtRecoverRecordVo.setAccDate(DueDataUtil.dateInfoTrans(bdRepayAccLoanTempVO.getCurDate()));
//		// 通过用信申请流水号和账务日期查询额度恢复记录
//		LmtRecoverRecordVO queryLmtRecoverRecordVo = lmtRecoverRecordService.queryByLmtApplySeqAndAccDate(inLmtRecoverRecordVo);
//		// 批量文件处理的时候，应该根据额度恢复留痕表的记录进行判断实时接口是否已经做过额度恢复。
//		// 若留痕表存在T-1日的该笔授信的额度恢复记录，则不需要进行额度恢复操作；
//		// 若不存在T-1日的该笔授信的额度恢复操作，则需要进行额度恢复相关操作。且预占用额度=上一次预占用额度；已占用额度=上一次已占用额度-客户归还本金金额。可用额度=授信额度-预占用-已占用。
//		// prin_amt 本金发生额
//		BigDecimal prinAmt = DueDataUtil.checkDecimalInfo(bdRepayAccLoanTempVO.getPrinAmt(), oneHundred100);
//		if (queryLmtRecoverRecordVo == null) {
//			// 上一次预占用额度
//			// BigDecimal preOccAmt = queryLmtPrdContVo == null ? BigDecimal.ZERO :
//			// queryLmtPrdContVo.getPreOccAmt();
//			// 上一次已占用额度
//			BigDecimal occAmt = queryLmtPrdContVo == null ? BigDecimal.ZERO : queryLmtPrdContVo.getOccAmt();
//			// 3、额度更新
//			// 预占用额度=上一次预占用额度；
//			// lmtPrdContVo.setPreOccAmt(lmtPrdContVo.getPreOccAmt() + "");
//			// 已占用额度=上一次已占用额度-客户归还本金金额
//			queryLmtPrdContVo.setOccAmt(occAmt.subtract(prinAmt));
//			// 可用额度=授信额度-预占用-已占用
//			BigDecimal oldAvailAmt = queryLmtPrdContVo.getAvailAmt();
//			BigDecimal newAvailAmt = queryLmtPrdContVo.getLmtAmt().subtract(queryLmtPrdContVo.getPreOccAmt())
//					.subtract(queryLmtPrdContVo.getOccAmt());
//			queryLmtPrdContVo.setAvailAmt(newAvailAmt);
//			String errorMsg = "批量文件同步，实时没有收到额度恢复通知，更新授信协议表出错";
//			// 更新授信协议表
//			int updateLmtNum = updateLmtPrdContInfo(queryLmtPrdContVo, queryNlsApplyInfoVO.getBdOrderId(), bdRepayAccLoanTempVO.getLoanId(),
//					errorMsg);
//			if (updateLmtNum == 1) {
//				// 生成额度恢复记录
//				insertLmtRecoverRecordInfo(queryNlsApplyInfoVO, bdRepayAccLoanTempVO, prinAmt, oldAvailAmt, newAvailAmt);
//			}
//		} else {
//			// 恢复金额
//			String recoverAmt = queryLmtRecoverRecordVo.getRecoverAmt() == null ? BigDecimal.ZERO.toString()
//					: queryLmtRecoverRecordVo.getRecoverAmt();
//			// 实时额度恢复金额与账务还款金额不一致
//			if (prinAmt.compareTo(new BigDecimal(recoverAmt)) != 0) {
//				String tableName = "lmt_prd_cont";
//				String errorMsg = "实时额度恢复金额与账务还款金额不一致，借据号：" + bdRepayAccLoanTempVO.getLoanId();
//				// 记录异常信息
//				this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
//
//				// 上一次预占用额度
//				// BigDecimal preOccAmt = queryLmtPrdContVo == null ? BigDecimal.ZERO :
//				// queryLmtPrdContVo.getPreOccAmt();
//				// 上一次已占用额度
//				BigDecimal occAmt = queryLmtPrdContVo == null ? BigDecimal.ZERO : queryLmtPrdContVo.getOccAmt();
//				// 3、额度更新
//				// 预占用额度=上一次预占用额度；
//				// lmtPrdContVo.setPreOccAmt(lmtPrdContVo.getPreOccAmt() + "");
//				// 已占用额度=上一次已占用额度-(本金发生额-恢复金额)
//				BigDecimal newRecoverAmt = prinAmt.subtract(new BigDecimal(recoverAmt));
//				queryLmtPrdContVo.setOccAmt(occAmt.subtract(newRecoverAmt));
//				// 可用额度=授信额度-预占用-已占用
//				BigDecimal newAvailAmt = queryLmtPrdContVo.getLmtAmt().subtract(queryLmtPrdContVo.getPreOccAmt())
//						.subtract(queryLmtPrdContVo.getOccAmt());
//				queryLmtPrdContVo.setAvailAmt(newAvailAmt);
//				errorMsg = "实时额度恢复金额与账务还款金额不一致，更新授信协议表出错";
//				// 更新授信协议表
//				int updateLmtNum = updateLmtPrdContInfo(queryLmtPrdContVo, queryNlsApplyInfoVO.getBdOrderId(),
//						bdRepayAccLoanTempVO.getLoanId(), errorMsg);
//				if (updateLmtNum == 1) {
//					// 恢复前额度
//					BigDecimal recoverBefAmt = queryLmtRecoverRecordVo.getRecoverBefAmt() == null ? BigDecimal.ZERO
//							: new BigDecimal(queryLmtRecoverRecordVo.getRecoverBefAmt());
//					// 更新额度恢复记录
//					updateLmtRecoverRecordInfo(queryNlsApplyInfoVO, bdRepayAccLoanTempVO, prinAmt, recoverBefAmt, newAvailAmt,
//							queryLmtRecoverRecordVo);
//				}
//			}
//		}
//	}

	/**
	 * 
	 * 生成额度恢复记录 <br>
	 * 0.1:ludayong:2019年5月23日 下午2:33:04:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月23日 下午2:33:04
	 * @date 2019年5月23日 下午2:33:04
	 * @version 0.1
	 */
//	public void insertLmtRecoverRecordInfo(NlsApplyInfoVO queryNlsApplyInfoVO, BdRepayAccLoanTempVO bdRepayAccLoanTempVO,
//			BigDecimal prinAmt, BigDecimal oldAvailAmt, BigDecimal newAvailAmt) throws Exception {
//		if (Objects.nonNull(queryNlsApplyInfoVO)) {
//			logger.error("批处理进行额度恢复处理开始");
//			LmtRecoverRecordVO inLmtRecoverRecordVo = new LmtRecoverRecordVO();
//			// 生成额度恢复记录
//			inLmtRecoverRecordVo.setLmtRecoverSeq(UUIDUtil.getUUID());// 额度恢复流水号
//			inLmtRecoverRecordVo.setLmtApplySeq(queryNlsApplyInfoVO.getApplySeq());// 用信申请流水号
//			inLmtRecoverRecordVo.setAccDate(DueDataUtil.dateInfoTrans(bdRepayAccLoanTempVO.getCurDate()));// 账务日期
//			inLmtRecoverRecordVo.setRecoverType("3");// 额度恢复类型 放款失败
//			inLmtRecoverRecordVo.setTranTime(DateUtility.getCurrAppDateTimeString());// 交易时间
//			inLmtRecoverRecordVo.setRecoverAmt(prinAmt + "");// 恢复金额
//			inLmtRecoverRecordVo.setChannelNo(queryNlsApplyInfoVO.getChannelNo());// 渠道号
//			inLmtRecoverRecordVo.setRecoverBefAmt(oldAvailAmt + "");// 恢复前额度
//			inLmtRecoverRecordVo.setRecoverLatAmt(newAvailAmt + "");// 恢复后额度
//			inLmtRecoverRecordVo.setCreateUser("admin");// 创建人
//			inLmtRecoverRecordVo.setCreateTime(DateUtility.getCurrAppDateTimeString());// 创建时间
//			inLmtRecoverRecordVo.setScene(BaseConstant.SCENE_1);// 恢复场景(0：实时 1：批量)
//			// 额度恢复记录表
//			int insertLmtNum = lmtRecoverRecordService.insertLmtRecoverRecord(inLmtRecoverRecordVo);
//			if (insertLmtNum < 1) {
//				// 批量文件处理的时候，应该根据额度恢复留痕表的记录进行判断实时接口是否已经做过额度恢复。
//				// 若留痕表存在T-1日的该笔授信的额度恢复记录，则不需要进行额度恢复操作；
//				logger.error("批处理进行额度恢复，新增额度恢复记录出错");
//				String tableName = "lmt_recover_record";
//				String errorMsg = "批处理进行额度恢复，新增额度恢复记录出错，放款订单号：" + queryNlsApplyInfoVO.getBdOrderId() + "，借据号："
//						+ bdRepayAccLoanTempVO.getLoanId();
//				// 记录异常信息
//				this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
//			}
//			logger.error("批处理进行额度恢复处理结束");
//		}
//	}

	/**
	 * 
	 * 更新额度恢复记录 <br>
	 * 0.1:ludayong:2019年5月23日 下午2:33:04:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月23日 下午2:33:04
	 * @date 2019年5月23日 下午2:33:04
	 * @version 0.1
	 */
//	public void updateLmtRecoverRecordInfo(NlsApplyInfoVO queryNlsApplyInfoVO, BdRepayAccLoanTempVO bdRepayAccLoanTempVO,
//			BigDecimal recoverAmt, BigDecimal oldAvailAmt, BigDecimal newAvailAmt, LmtRecoverRecordVO queryLmtRecoverRecordVo)
//			throws Exception {
//		if (Objects.nonNull(queryNlsApplyInfoVO)) {
//			logger.error("批处理进行额度恢复处理开始");
//			queryLmtRecoverRecordVo.setRecoverType("3");// 额度恢复类型 放款失败
//			queryLmtRecoverRecordVo.setRecoverAmt(recoverAmt + "");// 恢复金额
//			queryLmtRecoverRecordVo.setRecoverBefAmt(oldAvailAmt + "");// 恢复前额度
//			queryLmtRecoverRecordVo.setRecoverLatAmt(newAvailAmt + "");// 恢复后额度
//			queryLmtRecoverRecordVo.setCreateUser("admin");// 创建人
//			queryLmtRecoverRecordVo.setCreateTime(DateUtility.getCurrAppDateTimeString());// 创建时间
//			queryLmtRecoverRecordVo.setScene(BaseConstant.SCENE_1);// 恢复场景(0：实时 1：批量)
//			// 额度恢复记录表
//			int updateNum = lmtRecoverRecordService.updateByPk(queryLmtRecoverRecordVo);
//			if (updateNum < 1) {
//				// 实时额度恢复金额与账务还款金额不一致
//				logger.error("实时额度恢复金额与账务还款金额不一致进行额度恢复，更新额度恢复信息出错");
//				String tableName = "lmt_recover_record";
//				String errorMsg = "实时额度恢复金额与账务还款金额不一致进行额度恢复，更新额度恢复信息出错，放款订单号：" + queryNlsApplyInfoVO.getBdOrderId() + "，借据号："
//						+ bdRepayAccLoanTempVO.getLoanId();
//				// 记录异常信息
//				this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
//			}
//			logger.error("批处理进行额度恢复处理结束");
//		}
//	}

	/**
	 * 
	 * 更新额度信息 <br>
	 * 0.1:ludayong:2019年5月24日 上午11:02:59:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月24日 上午11:02:59
	 * @date 2019年5月24日 上午11:02:59
	 * @version 0.1
	 */
//	public int updateLmtPrdContInfo(LmtPrdContVO queryLmtPrdContVo, String orderId, String bdLoanId, String errorMsg) throws Exception {
//		// 更新授信协议表
//		int updateLmtNum = lmtPrdContService.updateByPk(queryLmtPrdContVo);
//		if (updateLmtNum < 1) {
//			logger.error(errorMsg);
//			String tableName = "lmt_prd_cont";
//			String remark = "更新额度信息表出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
//			// 记录异常信息
//			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
//		}
//		return updateLmtNum;
//	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
